//题目:
// 我们正在玩一个猜数游戏，游戏规则如下：
// 我从 1 到 n 之间选择一个数字。
// 你来猜我选了哪个数字。
// 如果你猜到正确的数字，就会 赢得游戏 。
// 如果你猜错了，那么我会告诉你，我选的数字比你的 更大或者更小 ，并且你需要继续猜数。
// 每当你猜了数字 x 并且猜错了的时候，你需要支付金额为 x 的现金。如果你花光了钱，就会 输掉游戏 。
// 给你一个特定的数字 n ，返回能够 确保你获胜 的最小现金数，不管我选择那个数字 。
#include<iostream>
#include<limits.h>
#include<vector>

using namespace std;
//代码:
class Solution 
{
    int arr[201][201]={0};
public:
    //得到[left,right]区间最小值
    int dfs(int left,int right)
    {
        if(left>=right)return 0;
        if(arr[left][right]!=0)return arr[left][right];

        int ret=INT_MAX;
        for(int i=left;i<=right;i++)
        {
            int left_val=dfs(left,i-1);
            int right_val=dfs(i+1,right);
            ret=min(ret,i+max(left_val,right_val));
        }
        arr[left][right]=ret;
        return ret;
    }
    int getMoneyAmount(int n) 
    {
        return dfs(1,n);
    }
};